home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / FFPEXP.SA < prev    next >
Text File  |  1989-08-30  |  10KB  |  205 lines

  1.          TTL       FAST FLOATING POINT EXPONENT (FFPEXP)
  2. ***************************************
  3. * (C) COPYRIGHT 1981 BY MOTOROLA INC. *
  4. ***************************************
  5.  
  6. *************************************************
  7. *                  FFPEXP                       *
  8. *       FAST FLOATING POINT EXPONENT            *
  9. *                                               *
  10. *  INPUT:   D7 - INPUT ARGUMENT                 *
  11. *                                               *
  12. *  OUTPUT:  D7 - EXPONENTIAL RESULT             *
  13. *                                               *
  14. *     ALL OTHER REGISTERS ARE TRANSPARENT       *
  15. *                                               *
  16. *  CODE SIZE: 256 BYTES   STACK WORK: 34 BYTES  *
  17. *                                               *
  18. *  CONDITION CODES:                             *
  19. *        Z - SET IF RESULT IN D7 IS ZERO        *
  20. *        N - CLEARED                            *
  21. *        V - SET IF OVERLOW OCCURRED            *
  22. *        C - UNDEFINED                          *
  23. *        X - UNDEFINED                          *
  24. *                                               *
  25. *                                               *
  26. *  NOTES:                                       *
  27. *    1) AN OVERFLOW RETURNS THE LARGEST         *
  28. *       MAGNITUDE NUMBER.                       *
  29. *    2) SPOT CHECKS SHOW AT LEAST 6.8 DIGIT     *
  30. *       ACCURACY FOR ALL ABS(ARG) < 30.         *
  31. *                                               *
  32. *  TIME: (8MHZ NO WAIT STATES ASSUMED)          *
  33. *                                               *
  34. *              488 MICROSECONDS                 *
  35. *                                               *
  36. *  LOGIC:   1) FIND N = INT(ARG/LN 2).  THIS IS *
  37. *              ADDED TO THE MANTISSA AT THE END.*
  38. *           3) REDUCE ARGUMENT TO RANGE BY      *
  39. *              FINDING ARG = MOD(ARG, LN 2).    *
  40. *           4) DERIVE EXP(ARG) WITH CORDIC LOOP.*
  41. *           5) ADD N TO EXPONENT GIVING RESULT. *
  42. *                                               *
  43. *************************************************
  44.          PAGE
  45. FFPEXP   IDNT  1,2 FFP EXP
  46.  
  47.          OPT       PCS
  48.  
  49.          SECTION   9
  50.  
  51.          XDEF      FFPEXP                        ENTRY POINT
  52.  
  53.          XREF      9:FFPHTHET                    HYPERTANGENT TABLE
  54.  
  55.          XREF      9:FFPMUL,9:FFPSUB    ARITHMETIC PRIMITIVES
  56.          XREF      9:FFPTNORM          TRANSCENDENTAL NORMALIZE ROUTINE
  57.          XREF      FFPCPYRT            COPYRIGHT STUB
  58.  
  59. LN2      EQU       $B1721840           LN 2 (BASE E)             .693147180
  60. LN2INV    EQU      $B8AA3B41           INVERSE OF LN 2 (BASE E) 1.44269504
  61. CNJKHINV EQU       $9A8F4441           FLOATING CONJUGATE OF K INVERSE
  62. *                                      CORRECTED FOR THE EXTRA CONVERGENCE
  63. *                                      DURING SHIFTS FOR 4 AND 13
  64. KFCTSEED EQU       $26A3D100           K CORDIC SEED
  65.  
  66.  
  67. * OVERFLOW - RETURN ZERO OR HIGHEST VALUE AND "V" BIT
  68. FPEOVFLW MOVE.W    (SP)+,D6            LOAD SIGN WORD AND WORK OFF STACK
  69.          TST.B     D6                  ? WAS ARGUMENT NEGATIVE
  70.          BPL.S     FPOVNZRO            NO, CONTINUE
  71.          MOVE.L    #0,D7               RETURN A ZERO
  72.          BRA.S     FPOVRTN             AS RESULT IS TOO SMALL
  73. FPOVNZRO MOVE.L    #-1,D7              SET ALL ZEROES
  74.          LSR.B     #1,D7               ZERO SIGN BIT
  75. *        OR.B      #$02,CCR            SET OVERFLOW BIT
  76.          DC.L      $003C0002           ***ASSEMBLER ERROR***
  77. FPOVRTN  MOVEM.L   (SP)+,D1-D6/A0      RESTORE REGISTERS
  78.          RTS                           RETURN TO CALLER
  79.  
  80. * RETURN ONE FOR ZERO ARGUMENT
  81. FFPE1    MOVE.L    #$80000041,D7       RETURN A TRUE ONE
  82.          LEA       7*4+2(SP),SP        IGNORE STACK SAVES
  83.          TST.B     D7                  SET CONDITION CODE PROPERLY
  84.          RTS                           RETURN TO CALLER
  85.  
  86. **************
  87. * EXP ENTRY  *
  88. **************
  89.  
  90. * SAVE WORK REGISTERS AND INSURE POSITIVE ARGUMENT
  91. FFPEXP   MOVEM.L   D1-D6/A0,-(SP)      SAVE ALL WORK REGISTERS
  92.          MOVE.W    D7,-(SP)            SAVE SIGN IN LOW ORDER BYTE FOR LATER
  93.          BEQ.S     FFPE1               RETURN A TRUE ONE FOR ZERO EXPONENT
  94.          AND.B     #$7F,D7             TAKE ABSOLUTE VALUE
  95.  
  96. * DIVIDE BY LOG 2 BASE E FOR PARTIAL RESULT
  97. FPEPOS   MOVE.L    D7,D2               SAVE ORIGINAL ARGUMENT
  98.          MOVE.L    #LN2INV,D6          LOAD INVERSE TO MULTIPLY (FASTER)
  99.          BSR       FFPMUL              OBTAIN DIVISION THRU MULTIPLY
  100.          BVS       FPEOVFLW            BRANCH IF TOO LARGE
  101. * CONVERT QUOTIENT TO BOTH FIXED AND FLOAT INTEGER
  102.          MOVE.B    D7,D5               COPY EXPONENT OVER
  103.          MOVE.B    D7,D6               COPY EXPONENT OVER
  104.          SUB.B     #64+32,D5           FIND NON-FRACTIONAL PRECISION
  105.          NEG.B     D5                  MAKE POSITIVE
  106.          CMP.B     #24,D5              ? INSURE NOT TOO LARGE
  107.          BLE.S     FPEOVFLW            BRANCH TOO LARGE
  108.          CMP.B     #32,D5              ? TEST UPPER RANGE
  109.          BGE.S     FPESML              BRANCH LESS THAN ONE
  110.          LSR.L     D5,D7               SHIFT TO INTEGER
  111.          MOVE.B    D7,(SP)             PLACE ADJUSTED EXPONENT WITH SIGN BYTE
  112.          LSL.L     D5,D7               BACK TO NORMAL WITHOUT FRACTION
  113.          MOVE.B    D6,D7               RE-INSERT SIGN+EXPONENT
  114.          MOVE.L    #LN2,D6             MULTIPLY BY LN2 TO FIND RESIDUE
  115.          BSR       FFPMUL              MULTIPLY BACK OUT
  116.          MOVE.L    D7,D6               SETUP TO SUBTRACT MULTIPLE OF LN 2
  117.          MOVE.L    D2,D7               MOVE ARGUMENT IN
  118.          BSR       FFPSUB              FIND REMAINDER OF LN 2 DIVIDE
  119.          MOVE.L    D7,D2               COPY FLOAT ARGUMENT
  120.          BRA.S     FPEADJ              ADJUST TO FIXED
  121.  
  122. * MULTIPLE LESS THAN ONE
  123. FPESML   CLR.B     (SP)                DEFAULT INITIAL MULTIPLY TO ZERO
  124.          MOVE.L    D2,D7               BACK TO ORIGINAL ARGUMENT
  125.  
  126. * CONVERT ARGUMENT TO BINARY(31,29) PRECISION
  127. FPEADJ   CLR.B     D7                  CLEAR SIGN AND EXPONENT
  128.          SUB.B     #64+3,D2            OBTAIN SHIFT VALUE
  129.          NEG.B     D2                  FOR 2 NON-FRACTION BITS
  130.          CMP.B     #31,D2              INSURE NOT TOO SMALL
  131.          BLS.S     FPESHF              BRANCH TO SHIFT IF OK
  132.          MOVE.L    #0,D7               FORCE TO ZERO
  133. FPESHF   LSR.L     D2,D7               CONVERT TO FIXED POINT
  134.  
  135. *****************************************
  136. * CORDIC CALCULATION REGISTERS:         *
  137. * D1 - LOOP COUNT   A0 - TABLE POINTER  *
  138. * D2 - SHIFT COUNT                      *
  139. * D3 - Y'   D5 - Y                      *
  140. * D4 - X'   D6 - X                      *
  141. * D7 - TEST ARGUMENT                    *
  142. *****************************************
  143.  
  144. * INPUT WITHIN RANGE, NOW START CORDIC SETUP
  145. FPECOM   MOVE.L    #0,D5               Y=0
  146.          MOVE.L    #KFCTSEED,D6        X=1 WITH JKHINVERSE FACTORED OUT
  147.          LEA       FFPHTHET,A0         POINT TO HPERBOLIC TANGENT TABLE
  148.          MOVE.L    #0,D2               PRIME SHIFT COUNTER
  149.  
  150. * PERFORM CORDIC LOOP REPEATING SHIFTS 4 AND 13 TO GUARANTEE CONVERGENCE
  151. * (REF. "A UNIFIED ALGORITHM FOR ELEMENTARY FUNCTIONS" J.S.WALTHER
  152. *        PG. 380 SPRING JOINT COMPUTER CONFERENCE 1971)
  153.          MOVE.L    #3,D1               DO SHIFTS 1 THRU 4
  154.          BSR.S     CORDIC              FIRST CORDIC LOOPS
  155.          SUB.L     #4,A0               REDO TABLE ENTRY
  156.          SUB.W     #1,D2               REDO SHIFT COUNT
  157.          MOVE.L    #9,D1               DO FOUR THROUGH 13
  158.          BSR.S     CORDIC              SECOND CORDIC LOOPS
  159.          SUB.L     #4,A0               BACK TO ENTRY 13
  160.          SUB.W     #1,D2               REDO SHIFT FOR 13
  161.          MOVE.L    #10,D1              NOW 13 THROUGH 23
  162.          BSR.S     CORDIC              AND FINISH UP
  163.  
  164. * NOW FINALIZE THE RESULT
  165.          TST.B     1(SP)               TEST ORIGINAL SIGN
  166.          BPL.S     FSEPOS              BRANCH POSITIVE ARGUMENT
  167.          NEG.L     D5                  CHANGE Y FOR SUBTRACTION
  168.          NEG.B     (SP)                NEGATE ADJUSTED EXPONENT TO SUBTRACT
  169. FSEPOS   ADD.L     D5,D6               ADD OR SUBTRACT Y TO/FROM X
  170.          BSR       FFPTNORM            FLOAT X
  171.          MOVE.L    D6,D7               SETUP RESULT
  172. * ADD LN2 FACTOR INTEGER TO THE EXPONENT
  173.          ADD.B     (SP),D7             ADD TO EXPONENT
  174.          BMI       FPEOVFLW            BRANCH IF TOO LARGE
  175.          BEQ       FPEOVFLW            BRANCH IF TOO SMALL
  176.          ADD.L     #2,SP               RID WORK DATA OFF STACK
  177.          MOVEM.L   (SP)+,D1-D6/A0      RESTORE REGISTERS
  178.          RTS                           RETURN TO CALLER
  179.  
  180. *************************
  181. * CORDIC LOOP SUBROUTINE*
  182. *************************
  183. CORDIC   ADD.W     #1,D2               INCREMENT SHIFT COUNT
  184.          MOVE.L    D5,D3               COPY Y
  185.          MOVE.L    D6,D4               COPY X
  186.          ASR.L     D2,D3               SHIFT FOR Y'
  187.          ASR.L     D2,D4               SHIFT FOR X'
  188.          TST.L     D7                  TEST ARG VALUE
  189.          BMI.S     FEBMI               BRANCH MINUS TEST
  190.          ADD.L     D4,D5               Y=Y+X'
  191.          ADD.L     D3,D6               X=X+Y'
  192.          SUB.L     (A0)+,D7            ARG=ARG-TABLE(N)
  193.          DBRA      D1,CORDIC           LOOP UNTIL DONE
  194.          RTS                           RETURN
  195.  
  196. FEBMI    SUB.L     D4,D5               Y=Y-X'
  197.          SUB.L     D3,D6               X=X-Y'
  198.          ADD.L     (A0)+,D7            ARG=ARG+TABLE(N)
  199.          DBRA      D1,CORDIC           LOOP UNTIL DONE
  200.          RTS                           RETURN
  201.  
  202.  
  203.          END
  204.  
  205.